#!/usr/bin/env python
# encoding: utf-8
'''
@author: wangjianrong
@software: pycharm
@file: 学习率相关.py
@time: 2020/10/9 9:11
@desc:
'''

from torchvision.models.resnet import resnet18
import torch

model = resnet18(False)
parameters = model.parameters()
lambda1 = lambda epoch:epoch//30
lambda2 = lambda epoch:0.95**epoch
optimizer = torch.optim.SGD(parameters,lr=0.1,momentum=0.9)

scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer,lr_lambda=lambda2)
for epoch in range(100):
    scheduler.step()
    print(optimizer.param_groups[0]['lr'])

'''
class ReduceLROnPlateau(object):
    def __init__(self, optimizer, mode='min', factor=0.1, patience=10,
                 verbose=False, threshold=1e-4, threshold_mode='rel',
                 cooldown=0, min_lr=0, eps=1e-8):
        pass
        
ReduceLROnPlateau参数解析
1、mode
mode可为min或者max，当mode为min时，监测的指标越低越好，当连续patience步没有降低时，则判定需要降低学习率，同理，当mode为max时，监测的指标越高越好
2、怎么判定监测的指标是变好了还是变坏了？
需要根据threshold_mode和threshold来判定，threshold_mode为rel和abs两种状态
当threshold_mode为rel模式时，表示相对变化，当为abs模式时，为绝对变化
以mode为min为例，之前的最佳指标为best，threshold=0.1
当threshold_mode为rel时，当当前指标<best*(1-threshold)表示满足条件，不需要更新学习率
当threshold_mode为abs时，当当前指标<best-threshold表示满足条件，不需要更新学习率
同理，当mode为max时，监测指标>best为满足条件
3、如何改变学习率？
factor表示学习率降低的比例，new_lr=max(old_lr*factor,min_lr)
当old_lr-new_lr>eps时，则更新学习率
以old_lr=1e-8，min_lr=0,eps=1e-8为例，
new_lr = max(old_lr*factor,min_lr) = 1e-8
old_lr - new_lr = 9e-9 < eps，学习率不变
4、cooldown
当改变学习率，需要经过cooldown个epoch热身，即使监测指标变差也不更新学习率
'''



